#ifndef RWLock_h
#define RWLock_h
#include <iostream>
#include <queue>
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <list>

using namespace std;

	/// Algunos tipos/estructuras que vamos a usar.
enum rw_t {w, r};
struct trupla{
	rw_t modo;
	pthread_cond_t *sem;
	int id;
};

class RWLock {
    public:
			/// Constructor: inicializa las variables compartidas y el mutex.
		RWLock();
			/// Función para pedir acceso de lectura. 
			/// Retorna de la función cuando tiene acceso.
        void rlock();
			/// Función para pedir acceso de escritura. 
			/// Retorna de la función cuando tiene acceso.
		void wlock();
			/// Función para terminar de leer.
		void runlock();
			/// Función para terminar de escribir.
		void wunlock();
    private:
			/// Cola de semaforos.
		list< trupla > cola;	
			/// Mutex unico para usar en todas las variables compartidas.
		pthread_mutex_t mutex_unico; 
			/// Cantidad de gente leyendo.
        int leyendo; 
			/// Si hay alguien escribiendo o no.
        bool escribiendo;   
			/// Identificador.
		int id;
		
		/// Funciones auxiliares:
				/// Saca de la cola un id.
			void sacarDeLaCola (int);
				/// Se fija si no hay ningun escritor entre el id y el principio.
			bool estoyParaLeer(int);
};

#endif
